import calendar
import datetime

# 定义活动的四个阶段及其包含的活动选项
ACTIVITY_STAGES = [
    ["采集", "招募"],  # 第一阶段：采集和招募活动
    ["修为提升", "装备强化", "装备熔炼", "商场兑换"],  # 第二阶段：修为提升、装备强化/熔炼以及商场兑换活动
    ["攻打NPC", "参与战场"],  # 第三阶段：攻打NPC和战场活动
    ["无礼金", "无礼金", "无礼金", "有礼金"],  # 第四阶段：区分是否有礼金的各类活动
]

# 初始化活动开始时间及每个阶段的初始配置
INIT_DATETIME = {
    "start_time": datetime.datetime(2024, 2, 1, 16, 0, 0),  # 活动开始的初始时间为2024年2月1日
    "stage_config": [1, 3, 1, 3],  # 每个活动阶段在初始时间下的对应配置
}


def is_valid_datetime(datetime_obj):
    """
    验证是否为有效的datetime对象。

    参数:
    - datetime_obj: 待验证的对象。

    返回值:
    - 布尔值，如果是有效的datetime对象则返回True，否则返回False。
    """
    return isinstance(datetime_obj, datetime.datetime)


def find_nearest_thursday(date):
    """
    找到给定日期之后最近的星期四。

    参数:
    - date: 待计算的日期对象。

    返回值:
    - datetime.datetime对象，表示最近的星期四的日期。
    """
    days_to_thursday = (calendar.THURSDAY - date.weekday() + 7) % 7
    return date + datetime.timedelta(days=days_to_thursday)


def compute(compute_time=datetime.datetime.now()):
    """
    根据当前时间计算活动阶段和活动选项。

    参数:
    - compute_time: 计算活动阶段时的基准时间，默认为当前时间。

    抛出:
    - ValueError: 如果传入的compute_time不是有效的datetime对象。
    """
    if not is_valid_datetime(compute_time):
        raise ValueError("compute_time must be a valid datetime.datetime object")

    # 计算相对于活动开始时间的时间差，并换算成周数
    time = compute_time - INIT_DATETIME["start_time"]
    week = int(time.days / 7)

    # 根据当前周数调整活动阶段配置
    for j in range(len(INIT_DATETIME["stage_config"])):
        INIT_DATETIME["stage_config"][j] = (INIT_DATETIME["stage_config"][j] + week) % len(ACTIVITY_STAGES[j])

    # 找到最近的星期四，作为活动阶段更新的基准日
    compute_time = find_nearest_thursday(compute_time)
    # 连续计算10周的活动阶段和活动选项
    for _ in range(1, 10):
        for j in range(len(INIT_DATETIME["stage_config"])):
            INIT_DATETIME["stage_config"][j] = (INIT_DATETIME["stage_config"][j] + 1) % len(ACTIVITY_STAGES[j])

        # 打印每周的活动安排
        stage = INIT_DATETIME["stage_config"]
        print(
            f"{compute_time.strftime('%Y-%m-%d')}: {ACTIVITY_STAGES[0][stage[0]]}, {ACTIVITY_STAGES[1][stage[1]]}, {ACTIVITY_STAGES[2][stage[2]]}, {ACTIVITY_STAGES[3][stage[3]]}")
        # 更新计算时间为下一周的最近星期四
        compute_time = find_nearest_thursday(compute_time + datetime.timedelta(days=7))


if __name__ == "__main__":
    compute()
